module display2(original_clk,led_sel,led_drv,rstn,key1,key2,key3,data);

//定义输入输出
input [43:0] data;
input original_clk,rstn;
input key1,key2,key3;
output [7:0] led_drv;
output [5:0] led_sel;
// 定义输入输出接口类型
wire [43:0] data;		
// 需要显示的动态数据,其中有4bit 作为 标志位 不能使用,所以可以用的位数有36bit 可以显示 9个4bit数据
wire original_clk,rstn;
//原始的时钟输入,时钟频率50M HZ,复位接按键
wire key1,key2,key3;  
//三个按键控制信号,可以控制进行输入数据

reg [7:0] led_drv;		
//最终的seg译码信号,控制数码管显示内容
wire [5:0] led_sel;		
//最终的显示输出,对外端口
//--------------------------------------------------------------------------------
//定义各种中间变量的类型
reg [23:0] contain;
//contain 是 6个数码管的当前显示内容, 一个数码管显示4bit 所以 contain 一共24bit 
reg [7:0] cnt;
wire clk;
//显示需要的 经过适度分频的时钟信号
reg [3:0] led_drv_temp;
//显示码的中间变量,表示当前一个周期 显示的 4bit 数据内容
reg [5:0] led_sel_temp;
//显示输出的中间变量,因为需要加一个控制信号,所以要先有一个中间值 暂存过程
reg [5:0] switch;
// 显示数码管开关信号 控制 做为动态显示的一个灭的标志,用于标记数据的起始,否则无法判断这个一组数据的起始位
reg [28:0] cnt1s;
//计数信号,通过计数,实现分频,进而控制数码管 在分时复用的基础上,加上游动显示


//接近1秒钟的分频,50M时钟 ,分 2的25次幂 频 时间 可以作为移位的驱动信号
always@(posedge original_clk or negedge rstn)begin
if(!rstn) 
	cnt1s =0;
else 
	if(	cnt1s[28:25]==4'b1011	)
	//直接对其高bit位进行译码,运算 省去了 中间的计数信号,即将计数值直接作为 分好频 并且记好数的信号
		cnt1s[28:25] = 4'b0000;
	else
	cnt1s=cnt1s+1'b1;
end

// 25进制计数器，的最高位，作为移动信号
	// 对移动信号计数，5进制计数
	// 计数值译码
always@(cnt1s)begin
	case(cnt1s[28:25])
	//不同的计数值,对应不同的数据内容,进行动态游动 移位
		4'b0000:	 contain <= 		data[43:20] 							;
		4'b0001:	 contain <= 		data[39:16] 							;
		4'b0010:	 contain <= 		data[35:12] 							;
		4'b0011:	 contain <= 		data[31:8]   							;
		4'b0100:	 contain <= 		data[27:4]   							;
		4'b0101:	 contain <= 		data[23:0]   							;
		4'b0110:	 contain <= {	data[19:0]	,	data[43:40]	}	;
		4'b0111:	 contain <= {	data[15:0]	,	data[43:36]	}	;
		4'b1000:	 contain <= {	data[11:0]	,	data[43:32]	}	;
		4'b1001:	 contain <= {	data[7:0]	,	data[43:28]	}	;
		4'b1010:	 contain <= {	data[3:0]	,	data[43:24]	}	;
		default:	 contain <= 23'h0	;                                                     
	endcase         
end

// data是要显示的全部比特数据
// contain是当前显示的比特数据

// 起始位 数码管灭 标记 开关控制
always@(cnt1s)begin
	case(cnt1s[28:25])
	//对cnt1s进行相应译码,选择控制 灭的数码管的位置
		4'b0000:	switch <= 6'b100000;
		4'b0001:	switch <= 6'b000000;
		4'b0010:	switch <= 6'b000000;
		4'b0011:	switch <= 6'b000000;
		4'b0100:	switch <= 6'b000000;
		4'b0101:	switch <= 6'b000000;
		4'b0110:	switch <= 6'b000001;
		4'b0111:	switch <= 6'b000010;
		4'b1000:	switch <= 6'b000100;
		4'b1001:	switch <= 6'b001000;
		4'b1010:	switch <= 6'b010000;
	    default:    switch <= 6'b000000;
						   
	endcase 
end
//选通开关 加入
assign led_sel = switch|led_sel_temp;
//持续赋值,让led_sel 最终的信号 是在switch的控制下进行 的



// 选择信号移位操作
always@(posedge clk or negedge rstn )begin
	if(!rstn)
		led_sel_temp <= 6'b000000;
	else
		if(led_sel_temp==6'b000000)
			// led_sel <= (switch[5:0])|(6'b111110);
			led_sel_temp <= 6'b111110;
		else
			// led_sel = led_sel
			led_sel_temp = {led_sel_temp[4:0],led_sel_temp[5]};
end

// 选择信号 对应数据传递
always@(led_sel_temp or rstn)begin
	// begin
		case(led_sel_temp)
			6'b111110:led_drv_temp <= contain[3:0];
			6'b111101:led_drv_temp <= contain[7:4];
			6'b111011:led_drv_temp <= contain[11:8];
			6'b110111:led_drv_temp <= contain[15:12];
			6'b101111:led_drv_temp <= contain[19:16];
			6'b011111:led_drv_temp <= contain[23:20];
			default:led_drv_temp <= 4'b0000;
		endcase
	// end
end

// 显示内容 seg 数码管译码
always@(led_drv_temp or rstn or cnt1s)begin
if(!rstn)
		led_drv  <=	8'b10111111;  //H_
	else begin
	
	case(led_drv_temp)
	// 一个数码管显示的4bit数据显示seg译码
		4'b0000:		led_drv  <=	8'b11000000;
		4'b0001:		led_drv  <=	8'b11111001;
		4'b0010:		led_drv  <=	8'b10100100;
		4'b0011:		led_drv  <=	8'b10110000;
		4'b0100:		led_drv  <=	8'b10011001;
		4'b0101:		led_drv  <=	8'b10010010;
		4'b0110:		led_drv  <=	8'b10000010;
		4'b0111:		led_drv  <=	8'b11111000;
		4'b1000:		led_drv  <=	8'b10000000;
		4'b1001:		led_drv  <=	8'b10010000;
		4'b1010:		led_drv  <=	8'b10001000;
		4'b1011:		led_drv  <=	8'b10000011;
		4'b1100:		led_drv  <=	8'b11000110;
		4'b1101:		led_drv  <=	8'b10100001;
		4'b1110:		led_drv  <=	8'b10000110;
		4'b1111:		led_drv  <=	8'b10001110;
		// default:		led_drv  <=	8'b10000001;  //H_
	endcase
	end
end
	
control_baud fenpin(.SAMPLING(clk),.CLK(original_clk),.RSTN(rstn));
//连接 分频模块 对原始时钟进行分频
endmodule